大家好,這裡是鐵匠史密斯
前兩天初步推論與驗證 javidx9 提供的式子,確認距離與牆壁高矮的關係(反比)
我們之前的code在編譯、執行過後,可以看到角色在世界地圖 (8, 3)
的位置,從 fPlayerA = 0
、 fAOV = 3.14159f / 4.0f
看到的結果如圖:
記得主控台大小要調整的跟 nScreenWidth = 120
、 nScreenHeight = 40
一樣哦!
接下來就是旋轉角色的方向 fPlayerA
了,讓我們直接開始吧!
我們先直接上code,明日再敘述一下原理~
// Controls
// Handle rotation
if (GetAsyncKeyState((unsigned short)'Q') & 0x8000)
fPlayerA += (0.1f);
if (GetAsyncKeyState((unsigned short)'E') & 0x8000)
fPlayerA -= (0.1f);
一樣地,我們借助了 Windows.h
微軟的套件來幫助我們偵測是否有特定按鍵被按下去~
當特定按鍵(Q
、 E
) 被按下時,更改角色方向 fPlayerA
。
但是,為什麼需要使用 &0x8000
呢?
這也是目前小弟我最困惑的部分,但查了幾個文獻後,可以知道 GetAsyncKeyState
會回傳 16個位元(bit)的值,像是:
0000 0000 0000 0000 (十進位 = 0)
其實可以使用code來測試按鍵的狀態
int main()
{
while (true)
{
short a = GetAsyncKeyState((unsigned short)'A');
printf("A key state: %d\n", a);
Sleep(1000);
}
return 0;
}
回傳的主控台數值以及發現的規律如下:
另外,查了資料發現,int -32767
相當於16進位的 0x8001
!
所以,就我認知,GetAsyncKeyState((unsigned short)'Q') & 0x8000
應當是確保Q鍵是持續按下的,才會更改玩家視角
設置完後,我們就可以旋轉玩家的方向 fPlayerA
啦:
GetAsyncKeyState()
移動玩家視角 fPlayerA
GetAsyncKeyState()
以及 0x8000
之間的關聯對於 16-bit 整數 以及 16進位 的部分真的要好好回去惡補~
明日應該會講述一下旋轉的原理,我們就可以進行下一步了~
繼續~走~下去~~